Context
In this exercise we are going to study the results from a particle analysis performed on a set of SEM images of Ni nanoparticles.
To obtain these nanoparticles, we start from Si wafers on which a 5 or 10 nm layer of Ni is deposited by PVD. These wafers are then heated in an H2 atmosphere to reduce them, which provokes the formation of nanoparticles through unwetting of the Si surface. These nanoparticles are then used as catalyst for the growth of vertically aligned carbon nanotubes by PECVD. As the diameter and density of the tubes are directly related to the diameter and density of the nanoparticles, we are interested in getting a clear idea of these parameters before performing the nanotube growth.
Some Ni-covered Si wafers were prepared before the first confinement (substrates labeled as old), some were prepared in September (new substrates). Here, we are interested in seeing whether the age and thickness of the Ni layer plays a role on the nanoparticles size and density. Also, the other parameters to study are the temperature at which the unwetting is performed, as well as the duration of this reaction.
To perform this study, we prepared samples from various substrates at various temperatures and during various times. The substrates are then observed with SEM, and several pictures are taken to increase the statistics. These pictures are then analyzed with ImageJ, as shown on Figure 1.1.
In this exercise, we are going to treat the tables obtained from ImageJ: these tables contain the (x,y) positions of the particles as well as their area.
LS0tCnRpdGxlIDogIlIgRXhlcmNpc2VzIC0gUGFydGljbGUgYW5hbHlzaXMgZnJvbSBTRU0gaW1hZ2VzIgpkYXRlICA6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiAKICAgIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoKICAgICAgICB0b2MgICAgICAgICAgICA6IFRSVUUKICAgICAgICB0b2NfZmxvYXQgICAgICA6IFRSVUUKICAgICAgICB0b2NfZGVwdGggICAgICA6IDQKICAgICAgICBoaWdobGlnaHQgICAgICA6IHRhbmdvCiAgICAgICAgbnVtYmVyX3NlY3Rpb25zOiBUUlVFCiAgICAgICAgY29kZV9kb3dubG9hZCAgOiBUUlVFCnBhcmFtczogCiAgICBzb2x1dGlvbjoKICAgICAgICB2YWx1ZTogRkFMU0UKLS0tCgoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYmxvY2txdW90ZSB7CiAgYmFja2dyb3VuZDogI0U5RjlGRjsKICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMjYwODY7CiAgbWFyZ2luOiAxLjVlbSAxMHB4OwogIHBhZGRpbmc6IDAuNWVtIDEwcHg7CiAgZm9udC1zaXplOiAxZW07Cn0KPC9zdHlsZT4KCiMgQ29udGV4dAoKSW4gdGhpcyBleGVyY2lzZSB3ZSBhcmUgZ29pbmcgdG8gc3R1ZHkgdGhlIHJlc3VsdHMgZnJvbSBhIHBhcnRpY2xlIGFuYWx5c2lzIHBlcmZvcm1lZCBvbiBhIHNldCBvZiBTRU0gaW1hZ2VzIG9mIE5pIG5hbm9wYXJ0aWNsZXMuIAoKVG8gb2J0YWluIHRoZXNlIG5hbm9wYXJ0aWNsZXMsIHdlIHN0YXJ0IGZyb20gU2kgd2FmZXJzIG9uIHdoaWNoIGEgNSBvciAxMCBubSBsYXllciBvZiBOaSBpcyBkZXBvc2l0ZWQgYnkgUFZELiBUaGVzZSB3YWZlcnMgYXJlIHRoZW4gaGVhdGVkIGluIGFuIEh+Mn4gYXRtb3NwaGVyZSB0byByZWR1Y2UgdGhlbSwgd2hpY2ggcHJvdm9rZXMgdGhlIGZvcm1hdGlvbiBvZiBuYW5vcGFydGljbGVzIHRocm91Z2ggdW53ZXR0aW5nIG9mIHRoZSBTaSBzdXJmYWNlLiBUaGVzZSBuYW5vcGFydGljbGVzIGFyZSB0aGVuIHVzZWQgYXMgY2F0YWx5c3QgZm9yIHRoZSBncm93dGggb2YgdmVydGljYWxseSBhbGlnbmVkIGNhcmJvbiBuYW5vdHViZXMgYnkgUEVDVkQuIEFzIHRoZSBkaWFtZXRlciBhbmQgZGVuc2l0eSBvZiB0aGUgdHViZXMgYXJlIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGRpYW1ldGVyIGFuZCBkZW5zaXR5IG9mIHRoZSBuYW5vcGFydGljbGVzLCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBnZXR0aW5nIGEgY2xlYXIgaWRlYSBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBuYW5vdHViZSBncm93dGguCgpTb21lIE5pLWNvdmVyZWQgU2kgd2FmZXJzIHdlcmUgcHJlcGFyZWQgYmVmb3JlIHRoZSBmaXJzdCBjb25maW5lbWVudCAoc3Vic3RyYXRlcyBsYWJlbGVkIGFzIGBvbGRgKSwgc29tZSB3ZXJlIHByZXBhcmVkIGluIFNlcHRlbWJlciAoYG5ld2Agc3Vic3RyYXRlcykuIEhlcmUsIHdlIGFyZSBpbnRlcmVzdGVkIGluIHNlZWluZyB3aGV0aGVyIHRoZSBhZ2UgYW5kIHRoaWNrbmVzcyBvZiB0aGUgTmkgbGF5ZXIgcGxheXMgYSByb2xlIG9uIHRoZSBuYW5vcGFydGljbGVzIHNpemUgYW5kIGRlbnNpdHkuIEFsc28sIHRoZSBvdGhlciBwYXJhbWV0ZXJzIHRvIHN0dWR5IGFyZSB0aGUgdGVtcGVyYXR1cmUgYXQgd2hpY2ggdGhlIHVud2V0dGluZyBpcyBwZXJmb3JtZWQsIGFzIHdlbGwgYXMgdGhlIGR1cmF0aW9uIG9mIHRoaXMgcmVhY3Rpb24uCgpUbyBwZXJmb3JtIHRoaXMgc3R1ZHksIHdlIHByZXBhcmVkIHNhbXBsZXMgZnJvbSB2YXJpb3VzIHN1YnN0cmF0ZXMgYXQgdmFyaW91cyB0ZW1wZXJhdHVyZXMgYW5kIGR1cmluZyB2YXJpb3VzIHRpbWVzLiBUaGUgc3Vic3RyYXRlcyBhcmUgdGhlbiBvYnNlcnZlZCB3aXRoIFNFTSwgYW5kIHNldmVyYWwgcGljdHVyZXMgYXJlIHRha2VuIHRvIGluY3JlYXNlIHRoZSBzdGF0aXN0aWNzLiBUaGVzZSBwaWN0dXJlcyBhcmUgdGhlbiBhbmFseXplZCB3aXRoIFtJbWFnZUpdKGh0dHBzOi8vaW1hZ2VqLm5ldC9XZWxjb21lKSwgYXMgc2hvd24gb24gRmlndXJlIFxAcmVmKGZpZzpTRU1pbWFnZXMpLiAKCmBgYHtyIFNFTWltYWdlcywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmNhcD0iVHlwaWNhbCBTRU0gaW1hZ2Ugb2YgTmkgbmFub3BhcnRpY2xlczogZnJvbSB0aGUgcmF3IGltYWdlIHRvIHBhcnRpY2xlIGFuYWx5c2lzIiwgZmlnLmFsaWduPSJjZW50ZXIiLCBvdXQud2lkdGg9IjMzJSIsIGZpZy5zaG93PSdob2xkJ30KbXlpbWFnZXMgPC0gYygiRGF0YS9NTDI2XzAxLnBuZyIsICJEYXRhL01MMjZfMDEtdGhyZXNob2xkLnBuZyIsICJEYXRhL01MMjZfMDEtcGFydGljbGVzLnBuZyIpCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKG15aW1hZ2VzKQpgYGAKCkluIHRoaXMgZXhlcmNpc2UsIHdlIGFyZSBnb2luZyB0byB0cmVhdCB0aGUgdGFibGVzIG9idGFpbmVkIGZyb20gSW1hZ2VKOiB0aGVzZSB0YWJsZXMgY29udGFpbiB0aGUgKHgseSkgcG9zaXRpb25zIG9mIHRoZSBwYXJ0aWNsZXMgYXMgd2VsbCBhcyB0aGVpciBhcmVhLgoKIyBEYXRhIHdyYW5nbGluZwoKLSBMb2FkIHRoZSBwYWNrYWdlcyBgdGlkeXZlcnNlYCwgYHJlYWR4bGAsIGB1bml0c2AsIGBicm9vbWAsIGFuZCBgZ2dmb3JjZWAuIFdlIGFyZSBnb2luZyB0byBnZXR0aW5nIHVzZWQgdG8gd29yayB3aXRoIHVuaXRzIGluIHRoaXMgZXhlcmNpc2UsIHdoaWNoIGlzIGEgdmVyeSBnb29kIGhhYml0IHRvIHRha2UgaW4gb3JkZXIgdG8gYXZvaWQgbWFueSB1bml0IGNvbnZlcnNpb24gcHJvYmxlbXMuIFRoZSBwYWNrYWdlIGBnZ2ZvcmNlYCBhbGxvd3MgZG9pbmcgYGdncGxvdGAgcGxvdHMgd2l0aCB0aWJibGVzIGNvbnRhaW5pbmcgdW5pdHMuIFNldCB0aGUgZ2xvYmFsIGBnZ3Bsb3QyYCB0aGVtZSB0byBibGFjayBhbmQgd2hpdGUuIEFsc28sIG1ha2UgaXQgc28gdGhhdCB0aGUgYHN0cmlwLmJhY2tncm91bmRgIChiYWNrZ3JvdW5kIG9mIHRoZSBmYWNldHMgdGl0bGVzKSBpcyBibGFuaywgYW5kIHRoYXQgdGhlIGBzdHJpcC50ZXh0YCBpcyBib2xkLgoKYGBge3IgaW5jbHVkZT1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHVuaXRzKQpsaWJyYXJ5KGdnZm9yY2UpCmxpYnJhcnkoYnJvb20pCnRoZW1lX3NldCh0aGVtZV9idygpKwogICAgICAgICAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9MTQpCiAgICAgICAgICAgICAgICApKQpgYGAKCi0gRmluZCBhbGwgTUx4eF94eF9jYy5jc3YgZmlsZXMgaW4gdGhlIGBEYXRhYCBmb2xkZXIgYW5kIHN0b3JlIHRoZW0gaW4gYGZsaXN0YC4KCmBgYHtyIGluY2x1ZGU9cGFyYW1zJHNvbHV0aW9uLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmZsaXN0IDwtIGxpc3QuZmlsZXMocGF0aD0iRGF0YSIsIHBhdHRlcm49Im0uY3N2IikKYGBgCgotIFJlYWQgdGhlIGBzYW1wbGUueGxzeGAgZmlsZSB0aGF0IGNvbnRhaW4gYWxsIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgdmFyaW91cyBzYW1wbGVzLCBzdWNoIGFzIHRoZWlyIHRlbXBlcmF0dXJlLCBzdWJzdHJhdGUgdHlwZSwgdGltZSBvZiByZWFjdGlvbiwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gYHNhbXBsZXNgLiAKICAgIC0gTW9kaWZ5IHRoZSB0aWJibGUgYHNhbXBsZXNgIHNvIHRoYXQgaXRzIGNvbHVtbnMgYXJlIG5hbWVkICJzYW1wbGUiLCAiVCIsICJ0aW1lIiwgYW5kICJzdWJzdHJhdGUiCiAgICAtIFVzaW5nIGBzZXBhcmF0ZSgpYHsuUn0sIHNlcGFyYXRlIHRoZSAic3Vic3RyYXRlIiBjb2x1bW4gaW50byAic3ViX3RoaWNrIiBhbmQgInN1Yl9hZ2UiIGNvbnRhaW5pbmcgdGhlIHRoaWNrbmVzcyBhbmQgYWdlIG9mIHRoZSBzdWJzdHJhdGUuIFVzZSBgY29udmVydCA9IFRSVUVgIHRvIGNvbnZlcnQgdGhlIGNoYXJhY3RlcnMgdG8gaW50ZWdlcnMgaWYgYXBwbGljYWJsZS4KICAgIC0gR2l2ZSB0aGUgY29sdW1ucyB0aGVpciBwcm9wZXIgdW5pdCB3aGVuIGFwcGxpY2FibGUgKHJlZmVyIHRvIFt0aGlzIGV4YW1wbGVdKGh0dHBzOi8vbG1pLmNucnMuZnIvci93b3JraW5nLXdpdGgtdW5pdHMuaHRtbCkpCgpgYGB7ciBpbmNsdWRlPXBhcmFtcyRzb2x1dGlvbiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFfQpzYW1wbGVzIDwtIHJlYWRfZXhjZWwoIkRhdGEvc2FtcGxlLnhsc3giKSAlPiUgCiAgICByZW5hbWUoc2FtcGxlICAgID0gIm5hbWUiLAogICAgICAgICAgIFQgICAgICAgICA9ICJUZW1wZXJhdHVyZSAowrBDKSIsCiAgICAgICAgICAgdGltZSAgICAgID0gIlRpbWUgKG1pbnV0ZXMpIiwKICAgICAgICAgICBzdWJzdHJhdGUgPSAiU3Vic3RyYXRlIChubSkiKSAlPiUgCiAgICBzZXBhcmF0ZShzdWJzdHJhdGUsIGMoInN1Yl90aGljayIsInN1Yl9hZ2UiKSwgY29udmVydCA9IFRSVUUpICU+JSAKICAgIG11dGF0ZShzdWJfdGhpY2sgPSBzZXRfdW5pdHMoc3ViX3RoaWNrLCJubSIpLAogICAgICAgICAgIHRpbWUgICAgICA9IHNldF91bml0cyh0aW1lLCJtaW4iKSwKICAgICAgICAgICBUICAgICAgICAgPSBzZXRfdW5pdHMoVCwiZGVnQyIpCiAgICAgICAgICAgKQpgYGAKCi0gQ3JlYXRlIHRoZSBgcmVhZGZpbGUoZmlsZW5hbWUpYHsuUn0gZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gb25lIG9mIHRoZSBjc3YgZmlsZXMgbmFtZXMsIHdpbGw6CiAgICAtIERldGVybWluZSB0aGUgdW5pdCB1c2VkIGluIHRoaXMgZmlsZTogZnJvbSBgZmlsZW5hbWVgLCBzdG9yZSB0aGUgdW5pdCBpbnRvIHRoZSB2YXJpYWJsZSBgVU5JVGAgKHRoYXQgc2hvdWxkIGJlIHRoZSBzdHJpbmcgYCJ1bSJgIG9yIGAibm0iYCkuIFlvdSBjYW4gdXNlIGB1bmxpc3Qoc3Ryc3BsaXQoZmlsZW5hbWUsIl8iKSlgey5SfSB0byBnZXQgYSB2ZWN0b3Igb2YgdGhlIGVsZW1lbnRzIG9mIGBmaWxlbmFtZWAgc2VwYXJhdGVkIGJ5IGEgYF9gIGNoYXJhY3Rlci4KICAgIC0gUmVhZCB0aGUgY3N2IGZpbGUsIHRoZW4gc3VjY2Vzc2l2ZWx5OgogICAgLSBTZWxlY3Qgb25seSB0aGUgWCwgWSBhbmQgQXJlYSBjb2x1bW5zIChzb21lIGZpbGVzIGhhdmUgbW9yZSBjb2x1bW5zKSBhbmQgcmVuYW1lIHRoZW0gdG8gbG93ZXJjYXNlcyBuYW1lcy4KICAgIC0gQWRkIHRoZSBgZmlsZWAgY29sdW1uIGNvbnRhaW5pbmcgdGhlIGZpbGVuYW1lLCBhbmQgdGhlbiBzZXBhcmF0ZSBpdCBpbnRvIDMgY29sdW1ucyBgc2FtcGxlYCwgYG51bWJlcmAgYW5kIGB1bml0YAogICAgLSBSZW1vdmUgdGhlIGB1bml0YCBjb2x1bW4KICAgIC0gQXBwbHkgdGhlIGNvcnJlc3BvbmRpbmcgdW5pdHMgdG8geCwgeSBhbmQgYXJlYS4gWW91IGNhbiBhcHBseSBhIHVuaXQgdG8gYSB2ZWN0b3IgYHhgIGJhc2VkIG9uIGEgKipzdHJpbmcqKiBgeHhgIHVzaW5nIGBzZXRfdW5pdHMoeCwgeHgsIG1vZGUgPSAic3RhbmRhcmQiKWB7LlJ9LgogICAgLSBDcmVhdGUgYSBjb2x1bW4gYGRpYW1ldGVyYCBjb250YWluaW5nIHRoZSBkaWFtZXRlciBvZiB0aGUgcGFydGljbGVzLgotIFRlc3QgdGhpcyBmdW5jdGlvbiBvbiAyIGZpbGVzIHdpdGggMiBkaWZmZXJlbnQgdW5pdHMgdG8gY2hlY2sgdGhhdCBpdCBnaXZlcyB0aGUgZXhwZWN0ZWQgcmVzdWx0LgoKYGBge3IgaW5jbHVkZT1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0KcmVhZGZpbGUgPC0gZnVuY3Rpb24oZmlsZW5hbWUpewogICAgVU5JVCA8LSB1bmxpc3Qoc3Ryc3BsaXQoZmlsZW5hbWUsIl8iKSkKICAgIFVOSVQgPC0gZ3N1YigiLmNzdiIsIiIsVU5JVFtsZW5ndGgoVU5JVCldKQogICAgcmVhZF9jc3YoZmlsZW5hbWUpICU+JSAKICAgICAgICByZW5hbWVfYWxsKHRvbG93ZXIpICU+JSAKICAgICAgICBzZWxlY3QoeCx5LGFyZWEpICU+JSAKICAgICAgICBtdXRhdGUoZmlsZT1nc3ViKCJEYXRhLyIsIiIsZmlsZW5hbWUpKSAlPiUgCiAgICAgICAgc2VwYXJhdGUoZmlsZSwgYygic2FtcGxlIiwibnVtYmVyIiwidW5pdCIpLCBzZXA9Il8iKSAlPiUgCiAgICAgICAgc2VsZWN0KC11bml0KSAlPiUgCiAgICAgICAgbXV0YXRlKHggICAgICAgID0gc2V0X3VuaXRzKHgsIFVOSVQsIG1vZGUgPSAic3RhbmRhcmQiKSwKICAgICAgICAgICAgICAgeSAgICAgICAgPSBzZXRfdW5pdHMoeSwgVU5JVCwgbW9kZSA9ICJzdGFuZGFyZCIpLAogICAgICAgICAgICAgICBhcmVhICAgICA9IHNldF91bml0cyhhcmVhLCBwYXN0ZTAoVU5JVCwiKiIsVU5JVCksIG1vZGUgPSAic3RhbmRhcmQiKSwKICAgICAgICAgICAgICAgZGlhbWV0ZXIgPSBzcXJ0KDQqYXJlYS9waSkpCn0KcmVhZGZpbGUoIkRhdGEvTUwxNl8wMl91bS5jc3YiKQpyZWFkZmlsZSgiRGF0YS9NTDE2XzA0X25tLmNzdiIpCmBgYAoKLSBVc2luZyBgcmVhZGZpbGUoKWB7LlJ9IHRoYXQgeW91IGp1c3QgZGVmaW5lZCwgcmVhZCBhbGwgY3N2IGZpbGVzIGFuZCBzdG9yZSB0aGVtIGludG8gYSB0aWR5IHRpYmJsZSBjYWxsZWQgYHBhcnRpY2xlc2AuICoqRG8gbm90IHVzZSBhIGZvciBsb29wIHRvIGRvIHNvLioqIEpvaW4gdGhpcyB0YWJsZSB3aXRoIHRoZSBgc2FtcGxlc2Agb25lLiBZb3Ugd2lsbCBzZWUgdGhhdCwgc2luY2Ugd2UgYXR0cmlidXRlZCB1bml0cyB0byBzb21lIGNvbHVtbnMsIGFsbCBkYXRhIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhIHNpbmdsZSB1bml0LiBGaWx0ZXIgdGhlIGRhdGEgZm9yIGRpYW1ldGVycyBsb3dlciB0aGFuIDQwIMK1bSBhcyBzb21lIHZlcnkgbGFyZ2UgcGFydGljbGVzIHdlcmUgZGV0ZWN0ZWQgaW4gdGhlIGltYWdlIHByb2Nlc3NpbmcgdGhhdCBhcmUgYWN0dWFsbHkgbm90IHBhcnRpY2xlcy4KCmBgYHtyIGluY2x1ZGU9cGFyYW1zJHNvbHV0aW9uLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBhcnRpY2xlcyA8LSB0aWJibGUoZmlsZT1mbGlzdCkgJT4lIAogICAgbXV0YXRlKGRhdGEgPSBtYXAoZmlsZSwgfnJlYWRmaWxlKGZpbGUucGF0aCgiRGF0YSIsLikpKSkgJT4lIAogICAgdW5uZXN0KGRhdGEpICU+JSAKICAgIGlubmVyX2pvaW4oc2FtcGxlcykgJT4lIAogICAgZmlsdGVyKGRpYW1ldGVyPHNldF91bml0cyg0MCwidW0iKSkKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CndyaXRlX3RzdihwYXJ0aWNsZXMsICJEYXRhL3BhcnRpY2xlcy5kYXQiKQpgYGAKCj4gSW4gY2FzZSB5b3UgZGlkbid0IG1hbmFnZSB0byBnZXQgdGhlcmUsIFtoZXJlXShEYXRhL3BhcnRpY2xlcy5kYXQpIGlzIHRoZSBgcGFydGljbGVzYCB0aWJibGUgKGl0IGRvZXNuJ3QgY29udGFpbiB0aGUgdW5pdHMgdGhvdWdoIGFzIHlvdSBjYW4ndCBzYXZlIGl0IGluIGEgdGV4dCBmaWxlLikKCgojIFBsb3R0aW5nIGFuZCBhbmFseXNpcwoKIyMgU2l6ZSBhbmFseXNpcwoKLSBOb3csIHBsb3QgdGhlIGhpc3RvZ3JhbSBvZiBhbGwgcGFydGljbGUgZGlhbWV0ZXJzLCB3aXRoIGEgZmlsbCBjb2xvciBkZXBlbmRpbmcgb24gdGhlIHRpbWUgKHlvdSBuZWVkIHRvIGNvbnZlcnQgdGltZSB0byBhIGZhY3RvciksIGFuZCB3aXRoIGEgZ3JpZCBzaG93aW5nIHRlbXBlcmF0dXJlIHZzLiBzdWJzdHJhdGUgYWdlIGFuZCB0aGlja25lc3MuIFB1dCB0aGUgbGVnZW5kIG9uIHRvcCBvZiB0aGUgZ3JhcGgsIGFuZCBhZGQgc29tZSB0cmFuc3BhcmVuY3kgdG8geW91ciBjb2xvcnMuCi0gSW4gZmFjdCwgSSB1c3VhbGx5IHByZWZlciB0byBwbG90IGl0IHVzaW5nIGBnZW9tX2RlbnNpdHkoKWB7LlJ9IHdoaWNoIGlzIGJhc2ljYWxseSBhbiBoaXN0b2dyYW0gY29udm9sdXRlZCB3aXRoIGEgR2F1c3NpYW4gZGlzdHJpYnV0aW9uIG9mIGJhbmR3aWR0aCBgYndgLiBUaGlzIGFsbG93cyBmb3Igc21vb3RoZXIgZ3JhcGhzLiBNYWtlIHRoaXMgcGxvdCBhbmQgcGxheSB3aXRoIHRoZSBgYndgIHBhcmFtZXRlci4KLSBDb252ZXJ0IC0tICp3aXRoIGdncGxvdCogLS0gdGhlIHVuaXQgb2YgdGhlIHBhcnRpY2xlIGRpYW1ldGVycyB0byBuYW5vbWV0ZXJzIG9yIGFueSBvdGhlciB1bml0IHlvdSB3YW50LgoKYGBge3IgaW5jbHVkZT1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGFydGljbGVzICU+JSAKICAgIGdncGxvdChhZXMoeD1kaWFtZXRlciwgZmlsbD1mYWN0b3IodGltZSkpKSsKICAgICAgICBnZW9tX2RlbnNpdHkoYWxwaGE9LjUsIGNvbG9yPU5BLCBidz00KSsKICAgICAgICBsYWJzKHggICAgPSAiYFBhcnRpY2xlIERpYW1ldGVyYCIsCiAgICAgICAgICAgICB5ICAgID0gIkRlbnNpdHkgW2FyYi4gdW5pdHNdIiwKICAgICAgICAgICAgIGZpbGwgPSAiVGltZSBbbWluXSIpKwogICAgICAgIGZhY2V0X2dyaWQocmVvcmRlcihwYXN0ZShULCJLIiksVCl+CiAgICAgICAgICAgICAgICAgICByZW9yZGVyKHBhc3RlKHN1Yl90aGljaywibm0gTmkgLSIsc3ViX2FnZSksc3ViX3RoaWNrKSwgCiAgICAgICAgICAgICAgICAgICBzY2FsZXM9ImZyZWVfeSIpKwogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSsKICAgICAgICBzY2FsZV94X3VuaXQodW5pdD0ibm0iLCBsaW1pdHM9YygwLDMwMCkpCmBgYAoKLSBOb3csIHN0b3JlIGluIGBwYXJ0aWNsZXNfYXZlYCB0aGUgYXZlcmFnZSBwYXJ0aWNsZSBkaWFtZXRlciBhbmQgaXRzIHN0YW5kYXJkIGRldmlhdGlvbiBwZXIgc3Vic3RyYXRlIHRoaWNrbmVzcyBhbmQgYWdlLCB0aW1lIGFuZCB0ZW1wZXJhdHVyZSBvZiByZWFjdGlvbi4gWW91IHdpbGwgbm90ZSB0aGF0IGBtZWFuKClgey5SfSBrZWVwcyB0aGUgdW5pdCBvZiB2ZWN0b3JzIHdoaWxlIGBzZCgpYHsuUn0gbG9zZXMgaXQuIE1ha2Ugc3VyZSB0aGF0IHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gY29sdW1uIGhhcyB0aGUgcHJvcGVyIHVuaXQgKHVzZSBgdW5pdHMoYSkgPC0gdW5pdHMoYilgey5SfSkuCgpgYGB7ciBpbmNsdWRlPXBhcmFtcyRzb2x1dGlvbiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwYXJ0aWNsZXNfYXZlIDwtIHBhcnRpY2xlcyAlPiUgCiAgICBncm91cF9ieShzdWJfdGhpY2ssIHN1Yl9hZ2UsIHRpbWUsIFQpICU+JSAKICAgIHN1bW1hcmlzZShkaWFtICAgPSBtZWFuKGRpYW1ldGVyKSwKICAgICAgICAgICAgICBzZGRpYW0gPSBzZChkaWFtZXRlcikpCnVuaXRzKHBhcnRpY2xlc19hdmUkc2RkaWFtKSA8LSB1bml0cyhwYXJ0aWNsZXNfYXZlJGRpYW0pCmBgYAoKLSBQbG90IHRoZSBhdmVyYWdlIGRpYW1ldGVyIGV2b2x1dGlvbiB3aXRoIHJlYWN0aW9uIHRpbWUsIHdpdGggYSBjb2xvciBwZXIgc3Vic3RyYXRlIHRoaWNrbmVzcywgYW5kIG9uIGEgZ3JpZCBzaG93aW5nIHN1YnN0cmF0ZSBhZ2UgdnMgdGVtcGVyYXR1cmUuCiAgICAtIERvbid0IGZvcmdldCB0byBhZGQgZXJyb3IgYmFycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgZGlhbWV0ZXJzIGRpc3RyaWJ1dGlvbi4KICAgIC0gQWRkIGEgbGluZSBzaG93aW5nIGEgbGluZWFyIGZpdCBmb3IgYWxsIGdyb3Vwcy4gCiAgICAtIE1ha2Ugc3VyZSBib3RoIHBsb3QgYXhlcyBnbyB0byAwLiAKICAgIC0gUHV0IHRoZSBsZWdlbmQgb24gdG9wLgogICAgLSBEZWZpbmUgbmljZSBheGlzIGxhYmVscyAod2l0aCBzZW50ZW5jZXMgaW5zdGVhZCBvZiBjb2x1bW4gbmFtZXMpLiBJbiBjYXNlIGEgY29sdW1uIGhhcyBhIHVuaXQgdGhhdCB3YXMgYXR0cmlidXRlZCwgaXQgd2lsbCByZXR1cm4gYW4gZXJyb3IgaW4gY2FzZSB0aGUgYXhpcyBsYWJlbCB5b3Ugd2FudCB0byBnaXZlIGNvbnRhaW5zIHdoaXRlIHNwYWNlcy4gWW91IHdpbGwgdGh1cyBuZWVkIHRvIHVzZSBiYWNrdGlja3MsIGxpa2Ugc286IGBgImBUd28gd29yZHNgImBgCgpgYGB7ciBpbmNsdWRlPXBhcmFtcyRzb2x1dGlvbiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwYXJ0aWNsZXNfYXZlICU+JSAKICAgIGdncGxvdChhZXMoeD10aW1lLCB5PWRpYW0sIGNvbG9yPWZhY3RvcihzdWJfdGhpY2spKSkrCiAgICAgICAgZ2VvbV9wb2ludChhbHBoYT0uNSkrCiAgICAgICAgZXhwYW5kX2xpbWl0cyh4ID0gMCwgeT0wKSsKICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWRpYW0tc2RkaWFtLHltYXg9ZGlhbStzZGRpYW0pLCB3aWR0aD0uMikrCiAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPUZBTFNFLCApKwogICAgICAgIGZhY2V0X2dyaWQoVH5zdWJfYWdlKSsKICAgICAgICBsYWJzKHggICAgID0gIlRpbWUiLAogICAgICAgICAgICAgeSAgICAgPSAiYEF2ZXJhZ2UgcGFydGljbGUgZGlhbWV0ZXJgIiwKICAgICAgICAgICAgIGNvbG9yID0gIlN1YnN0cmF0ZSB0aGlja25lc3MgW25tXSIpKwogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSsKICAgICAgICBzY2FsZV95X3VuaXQodW5pdD0ibm0iKQpgYGAKCi0gVXNpbmcgYGJyb29tYCBkaXNwbGF5IHRoZSBzbG9wZXMgYW5kIGludGVyY2VwdCBvZiBhbGwgbGluZWFyIGZpdHMsICoqd2l0aG91dCB1c2luZyBhIGZvciBsb29wKiouIFRoaXMgZG9lc24ndCB3b3JrIHdlbGwgd2l0aCB1bml0cywgc28gcHJpb3IgdG8gZG9pbmcgdGhlIGZpdCwgcmVtb3ZlIHRoZSB1bml0cyBvZiB5b3VyIHRpbWUgYW5kIGRpYW1ldGVyIGNvbHVtbnMgdXNpbmcgYGFzLnZlY3RvcigpYHsuUn0uCgpgYGB7ciBpbmNsdWRlPXBhcmFtcyRzb2x1dGlvbiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwYXJ0aWNsZXNfYXZlICU+JSAKICAgIG11dGF0ZShkaWFtICAgPSBhcy52ZWN0b3Ioc2V0X3VuaXRzKGRpYW0sIm5tIikpLAogICAgICAgICAgIHNkZGlhbSA9IGFzLnZlY3RvcihzZXRfdW5pdHMoc2RkaWFtLCJubSIpKSwKICAgICAgICAgICB0aW1lICAgPSBhcy52ZWN0b3IodGltZSkKICAgICAgICAgICApICU+JSAKICAgIG5lc3QoZGF0YT0tYyhzdWJfdGhpY2ssc3ViX2FnZSxUKSkgJT4lIAogICAgbXV0YXRlKGZpdCAgICA9IG1hcChkYXRhLCB+bG0oZGF0YT0uLCBkaWFtfnRpbWUsIHdlaWdodHMgPSAxL3NkZGlhbSkpLAogICAgICAgICAgIHRpZGllZCA9IG1hcChmaXQsIHRpZHkpKSAlPiUgCiAgICB1bm5lc3QodGlkaWVkKSAlPiUgCiAgICBzZWxlY3Qoc3ViX3RoaWNrLHN1Yl9hZ2UsVCx0ZXJtLGVzdGltYXRlLHN0ZC5lcnJvcikgJT4lIAogICAgbXV0YXRlKHRlcm09Z3N1YigiXFwoSW50ZXJjZXB0XFwpIiwieTAiLHRlcm0pKSAlPiUgCiAgICBtdXRhdGUodGVybT1nc3ViKCJ0aW1lIiwic2xvcGUiLHRlcm0pKSAlPiUgCiAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdGVybSwgCiAgICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYyhlc3RpbWF0ZSxzdGQuZXJyb3IpKSAlPiUgCiAgICBzZXRfbmFtZXMofiBzdHJfdG9fbG93ZXIoLikgJT4lCiAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZV9hbGwoImVzdGltYXRlXyIsIiIpICU+JSAKICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlX2FsbCgic3RkLmVycm9yXyIsImQiKSkgJT4lIAogICAgc2VsZWN0KHN1Yl90aGljayxzdWJfYWdlLHQseTAsZHkwLHNsb3BlLGRzbG9wZSkKYGBgCgojIyBEZW5zaXR5IGFuZCBvcmRlcmluZyBhbmFseXNpcwoKLSBOb3cgd2Ugd2FudCB0byBzZWUgdGhlIGV2b2x1dGlvbiBvZiB0aGUgZGVuc2l0eSBvZiBwYXJ0aWNsZXMgYW5kIHRoZWlyIG9yZGVyaW5nLiBPbmUgd2F5IG9mIGRvaW5nIHRoaXMgaXMgdG8gbG9vayBhdCB0aGUgKkcocikqIGRpc3RyaWJ1dGlvbiwgKmkuZS4qIHRoZSBwcm9iYWJpbGl0eSB0byBmaW5kIGEgcGFydGljbGUgaW4gKnIqIGlmIG9uZSBpcyBpbiAwLiBJIHByb3ZpZGUgaGVyZSBiZWxvdyB0aGUgZnVuY3Rpb24gYGdvZnIoeCx5LGRyLFJtYXgpYHsuUn0gdGhhdCBjb21wdXRlcyBpdCBiZXR3ZWVuIGAwYCBhbmQgYFJtYXhgIHdpdGggYSBzdGVwIGBkcmAsIHByb3ZpZGVkIHRoZSAoeCx5KSBwb3NpdGlvbnMgb2YgcGFydGljbGVzLgoKYGBge3IgaW5jbHVkZT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmdvZnIgPC0gZnVuY3Rpb24oeCwgeSwgZHI9LjIsIFJtYXg9MTApewogICAgIyBNYWtlIHN1cmUgdW5pdHMgYXJlIHVuaWZvcm0gYmVmb3JlIHVzaW5nIGRpc3QoKQogICAgdW5pdHMoeSkgPC0gdW5pdHMoeCkgCiAgICAjIGRyIGFuZCBSbWF4IGFyZSB1bml0bGVzcyBidXQgc2hvdWxkIGJlIGdpdmVuIGluIHRoZSBzYW1lIHVuaXRzIGFzIHgKICAgIGRyICAgPC0gYXMudmVjdG9yKGRyKQogICAgUm1heCA8LSBhcy52ZWN0b3IoUm1heCkKICAgICMgR2V0IGEgdmVjdG9yIG9mIGFsbCBFdWNsaWRpYW4gZGlzdGFuY2VzCiAgICBkZCAgIDwtIGFzLnZlY3RvcihkaXN0KHRpYmJsZTo6dGliYmxlKHgseSkpKQogICAgIyBNYWtlIGEgaGlzdG9ncmFtIG91dCBvZiBpdAogICAgZGQuaGlzdCA8LSBoaXN0KGRkLCAKICAgICAgICAgICAgICAgICAgICBicmVha3M9c2VxKDAsIG1heChkZCkrZHIsIGJ5PWRyKSwKICAgICAgICAgICAgICAgICAgICBwbG90PUZBTFNFKQogICAgIyBHZXQgdGhlIHIgdmFsdWVzCiAgICByIDwtIGRkLmhpc3QkbWlkcwogICAgIyBDb21wdXRlIHRoZSBub3JtYWxpemF0aW9uIGJ5IHRoZSBzdXJmYWNlIG9mIHRoZSAKICAgICMgcmluZyBvZiByYWRpdXMgciBhbmQgdGhpY2tuZXNzIGRyCiAgICBybG8gIDwtIHIgLSBkci8yCiAgICBydXAgIDwtIHIgKyBkci8yCiAgICByaW5nIDwtIHBpKihydXBeMiAtIHJsb14yKQogICAgIyBSZXR1cm4gdGhlIHRpYmJsZSBjb250YWluaW5nIHIgYW5kIEcocikgd2l0aCB0aGUgc2FtZSB1bml0IGFzIHgKICAgICMgT25seSBkYXRhIGZvciByPFJtYXggaXMgd2FudGVkLCBhbmQgd2UgcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IHRvbwogICAgZCA8LSB0aWJibGU6OnRpYmJsZShSICAgID0gcltyPFJtYXhdLCAKICAgICAgICAgICAgICAgICAgICAgICAgR29mUiA9IGRkLmhpc3QkY291bnRzW3I8Um1heF0vcmluZ1tyPFJtYXhdKSAlPiUgCiAgICAgICAgICAgIHJlbmFtZShyPSJSIixnb2ZyPSJHb2ZSIikKICAgIHVuaXRzKGQkcikgPC0gdW5pdHMoeCkKICAgIGRbLTEsXQp9CmBgYAoKLSBVc2luZyBwaXBlIG9wZXJhdGlvbnMsIGNvbXB1dGUgRyhyKSBmb3IgZWFjaCBpbWFnZSBhbmQgc3RvcmUgaXQgaW50byBgcGFydGljbGVzX2dvZnJgLiAKICAgIC0gV2Ugd2FudCB0byBjb21wdXRlIEcocikgdXAgdG8gNTAwIG5tIGJ5IHN0ZXAgb2YgMiBubS4gTWFrZSBzdXJlIHgsIHksIGRyIGFuZCBSbWF4IGFyZSBnaXZlbiB3aXRoIHRoZSBzYW1lIHVuaXQuCiAgICAtIFRoZW4sIGNvbXB1dGUgdGhlIGF2ZXJhZ2UgRyhyKSBmb3IgZWFjaCBzYW1wbGUuCiAgICAtIEpvaW4gYHBhcnRpY2xlc19nb2ZyYCB3aXRoIGBzYW1wbGVzYCB0byByZXRyaWV2ZSB0aGUgc2FtcGxlcyBpbmZvcm1hdGlvbgoKYGBge3IgaW5jbHVkZT1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGFydGljbGVzX2dvZnIgPC0gcGFydGljbGVzICU+JSAKICAgIG11dGF0ZSh4ID0gc2V0X3VuaXRzKHgsIm5tIiksCiAgICAgICAgICAgeSA9IHNldF91bml0cyh5LCJubSIpCiAgICAgICAgICAgKSAlPiUgCiAgICBuZXN0KGRhdGEgPSAtYyhzYW1wbGUsIG51bWJlcikpICU+JSAKICAgIG11dGF0ZShHb2ZSID0gbWFwKGRhdGEsIH5nb2ZyKC4keCwgLiR5LCBkcj0yLCBSbWF4PTUwMCkpKSAlPiUgCiAgICB1bm5lc3QoR29mUikgJT4lIAogICAgZ3JvdXBfYnkoc2FtcGxlLCByKSAlPiUgCiAgICBzdW1tYXJpemUoZ29mcj1tZWFuKGdvZnIpKSAlPiUgCiAgICBpbm5lcl9qb2luKHNhbXBsZXMpCmBgYAoKLSBGaW5kIHRoZSBiZXN0IHdheSB0byByZXByZXNlbnQgRyhyKSBmb3IgYWxsIHNhbXBsZXMsIHRoYXQgYWxsb3dzIHNlZWluZyB0aGUgZXZvbHV0aW9uIHdpdGggYWxsIHBhcmFtZXRlcnMuCgpgYGB7ciBpbmNsdWRlPXBhcmFtcyRzb2x1dGlvbiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwYXJ0aWNsZXNfZ29mciAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9ciwgCiAgICAgICAgICAgICAgIHk9Z29mciwgCiAgICAgICAgICAgICAgIGNvbG9yPWZhY3Rvcih0aW1lKSkpKwogICAgICAgIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBhbHBoYT0uNSwgc3Bhbj0uMTUsIHNlPUZBTFNFKSsKICAgICAgICBnZW9tX2xpbmUoYWxwaGE9LjIpKwogICAgICAgIGV4cGFuZF9saW1pdHMoeCA9IDAsIHk9MCkrCiAgICAgICAgZmFjZXRfZ3JpZChyZW9yZGVyKHBhc3RlKFQsIksiKSxUKX4KICAgICAgICAgICAgICAgICAgIHJlb3JkZXIocGFzdGUoc3ViX3RoaWNrLCJubSBOaSAtIixzdWJfYWdlKSxzdWJfdGhpY2spLCAKICAgICAgICAgICAgICAgICAgIHNjYWxlcz0iZnJlZV95IikrCiAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpKwogICAgICAgIGxhYnMoeCAgICAgPSAiciIsCiAgICAgICAgICAgICB5ICAgICA9ICJHKHIpIiwKICAgICAgICAgICAgIGNvbG9yID0gIlRpbWUgW21pbl0iKQpgYGAKCgoKCgoKCg==